Перейти к основному содержимому

7.06. Справочник по Docker

Разработчику Архитектору Инженеру

Справочник по Docker

Docker — это платформа для создания, запуска и управления контейнеризированными приложениями. Контейнеры изолируют процессы и зависимости, обеспечивая единообразие выполнения в разных средах. Docker использует образы как шаблоны для запуска контейнеров, а также предоставляет инструменты для сетевого взаимодействия, хранения данных, сборки, развёртывания и оркестрации.


Основные понятия

Образ (Image)

Образ — неизменяемый шаблон файловой системы с метаданными, необходимыми для запуска контейнера. Состоит из слоёв, каждый из которых представляет собой изменения относительно предыдущего. Образы хранятся в реестрах (например, Docker Hub) или локально.

Контейнер (Container)

Контейнер — исполняемый экземпляр образа. Имеет собственное пространство имён, PID, сеть, точку монтирования и другие изолированные ресурсы ядра Linux. Контейнер может быть запущен, остановлен, перезапущен, удалён.

Реестр (Registry)

Реестр — хранилище образов. Docker Hub — публичный реестр по умолчанию. Можно использовать частные реестры (например, Harbor, AWS ECR, GitLab Container Registry).

Dockerfile

Файл с инструкциями для сборки образа. Каждая инструкция создаёт новый слой. Поддерживает кэширование слоёв для ускорения повторной сборки.

Volume

Том — механизм постоянного хранения данных вне жизненного цикла контейнера. Поддерживает именованные тома, привязку к директории хоста (bind mount), tmpfs.

Сеть (Network)

Сеть — изолированное пространство для взаимодействия контейнеров. Docker поддерживает несколько драйверов сетей: bridge, host, overlay, macvlan, none.

Docker Compose

Инструмент для определения и запуска многоконтейнерных приложений с помощью файла docker-compose.yml. Упрощает управление зависимостями, сетями, томами и переменными окружения.

Docker Daemon

Фоновый процесс, управляющий контейнерами, образами, сетями и томами. Принимает команды через CLI или REST API.

Docker Client

Клиентская утилита (docker), отправляющая команды демону через Unix-сокет или TCP.


Команды Docker CLI

Управление образами

docker build

Собирает образ из Dockerfile.

Параметры:

  • -t, --tag: задаёт имя и тег образа (myapp:v1)
  • -f, --file: указывает путь к Dockerfile (по умолчанию ./Dockerfile)
  • --build-arg: передаёт аргументы сборки (ARG_NAME=value)
  • --no-cache: отключает использование кэша слоёв
  • --pull: принудительно обновляет базовые образы
  • --target: указывает целевой stage в multi-stage сборке
  • --platform: задаёт целевую архитектуру (linux/amd64, linux/arm64)

Пример:

docker build -t myapp:latest --build-arg ENV=prod .

docker images

Список локальных образов.

Параметры:

  • -a, --all: показывает промежуточные образы
  • -q, --quiet: выводит только ID
  • --filter: фильтрация по критериям (dangling=true, label=env=prod)
  • --format: формат вывода (Go-шаблон)

docker rmi

Удаляет образ.

Параметры:

  • -f, --force: принудительное удаление
  • --no-prune: не удалять родительские образы

docker tag

Присваивает дополнительный тег образу.

Пример:

docker tag myapp:latest registry.example.com/myapp:stable

docker push / docker pull

Загрузка и выгрузка образов в/из реестра.

Параметры:

  • --platform: указывает архитектуру при pull (если манифест поддерживает multi-arch)

Управление контейнерами

docker run

Запускает новый контейнер из образа.

Ключевые параметры:

Идентификация и имя

  • --name: задаёт имя контейнера
  • -d, --detach: запуск в фоне
  • --rm: автоматическое удаление после завершения

Сеть

  • --network: указывает сеть (bridge, host, имя пользовательской сети)
  • -p, --publish: проброс портов (host_port:container_port, например 8080:80)
  • -P, --publish-all: публикует все EXPOSE-порты на случайные порты хоста
  • --dns: задаёт DNS-серверы
  • --hostname: задаёт hostname внутри контейнера

Хранилище

  • -v, --volume: монтирует том или директорию (/host/path:/container/path, volume_name:/container/path)
  • --mount: альтернатива -v с более явным синтаксисом (type=bind,source=...,target=...)
  • --tmpfs: монтирует временную файловую систему в RAM

Окружение и переменные

  • -e, --env: задаёт переменную окружения (KEY=value)
  • --env-file: загружает переменные из файла
  • -u, --user: задаёт пользователя внутри контейнера (uid:gid)

Ресурсы

  • --cpus: ограничивает количество CPU (например, 1.5)
  • --memory, -m: ограничивает объём RAM (512m, 2g)
  • --memory-swap: общий лимит RAM + swap
  • --cpu-shares: вес CPU при распределении ресурсов
  • --cpuset-cpus: привязка к конкретным CPU-ядрам (0-3, 1,2)

Безопасность

  • --privileged: даёт контейнеру расширенные привилегии (доступ ко всем устройствам)
  • --cap-add, --cap-drop: добавляет или удаляет Linux capabilities (NET_ADMIN, SYS_TIME)
  • --security-opt: настройки безопасности (seccomp=profile.json, apparmor=unconfined)
  • --read-only: делает корневую ФС контейнера только для чтения
  • --userns: включает user namespace remapping

Вход и интерактивность

  • -i, --interactive: сохраняет STDIN открытым
  • -t, --tty: выделяет псевдо-TTY
  • --entrypoint: переопределяет точку входа из образа

Жизненный цикл

  • --restart: политика перезапуска (no, on-failure[:max-retries], always, unless-stopped)
  • --stop-timeout: время ожидания graceful shutdown перед SIGKILL (в секундах)
  • --health-cmd: команда для проверки здоровья
  • --health-interval, --health-timeout, --health-retries: параметры healthcheck

Пример:

docker run -d \
--name webapp \
--restart unless-stopped \
-p 80:80 \
-v app_data:/var/www/html \
-e NODE_ENV=production \
--memory=512m \
nginx:alpine

docker ps

Список запущенных контейнеров.

Параметры:

  • -a, --all: показывает все (включая остановленные)
  • -q, --quiet: только ID
  • --filter: фильтрация (status=exited, ancestor=nginx, name=web)
  • --format: Go-шаблон вывода

docker stop / docker start / docker restart

Управление состоянием контейнера.

  • docker stop отправляет SIGTERM, затем SIGKILL через таймаут
  • docker kill отправляет SIGKILL немедленно (или другой сигнал через -s)

docker exec

Выполняет команду внутри работающего контейнера.

Параметры:

  • -i, -t: интерактивный режим
  • -u: пользователь
  • -w: рабочая директория

Пример:

docker exec -it webapp sh

docker logs

Просмотр логов контейнера.

Параметры:

  • -f, --follow: потоковый вывод
  • --tail: количество последних строк
  • -t, --timestamps: добавляет временные метки

docker inspect

Подробная информация о контейнере, образе, сети, томе в формате JSON.

Параметры:

  • -f, --format: извлечение конкретного поля (Go-шаблон)

Пример:

docker inspect -f '{{.NetworkSettings.IPAddress}}' webapp

docker cp

Копирование файлов между хостом и контейнером.

Пример:

docker cp ./config.txt webapp:/app/
docker cp webapp:/app/logs ./logs/

docker update

Динамическое изменение ресурсов работающего контейнера (CPU, memory, restart policy).

Пример:

docker update --memory=1g webapp

Управление томами

docker volume create

Создаёт именованный том.

Параметры:

  • --driver: драйвер тома (local, nfs, aws-ebs)
  • -o, --opt: опции драйвера (type=nfs, device=...)

Пример:

docker volume create db_data

docker volume ls

Список томов.

docker volume inspect

Детали тома (путь на хосте, драйвер, метки).

docker volume rm

Удаление тома.

Параметры:

  • -f, --force: принудительное удаление

docker volume prune

Удаляет все неиспользуемые тома.


Управление сетями

docker network create

Создаёт пользовательскую сеть.

Параметры:

  • --driver: тип сети (bridge, overlay, macvlan)
  • --subnet, --ip-range, --gateway: настройки IP
  • --attachable: разрешает подключение standalone-контейнеров (для overlay)
  • --internal: запрещает исходящий трафик в интернет
  • --opt: опции драйвера

Пример:

docker network create --driver bridge --subnet=172.20.0.0/16 mynet

docker network connect / disconnect

Подключение/отключение контейнера к/от сети.

docker network inspect

Детали сети: подключённые контейнеры, IP-адреса, настройки.

docker network prune

Удаляет неиспользуемые сети.


Dockerfile

Синтаксис и структура

Dockerfile — текстовый файл с набором инструкций для сборки образа. Каждая инструкция создаёт новый слой в образе. Инструкции выполняются последовательно сверху вниз.

Формат:

# Комментарий
ИНСТРУКЦИЯ аргументы

Основные инструкции

FROM

Задаёт базовый образ. Обязательная первая инструкция (кроме комментариев и ARG до FROM).

Синтаксис:

FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]

Примеры:

FROM alpine:3.18
FROM node:20-alpine AS builder
FROM --platform=linux/arm64 ubuntu:22.04

ARG

Определяет переменную, доступную только во время сборки. Может иметь значение по умолчанию.

Синтаксис:

ARG <name>[=<default value>]

Пример:

ARG NODE_VERSION=20
FROM node:${NODE_VERSION}-alpine

Передача из CLI:

docker build --build-arg NODE_VERSION=18 .

⚠️ ARG не сохраняется в образе после сборки. Для переменных среды выполнения используйте ENV.

ENV

Задаёт переменную окружения, доступную во время сборки и выполнения.

Синтаксис:

ENV <key>=<value>
ENV <key> <value>

Пример:

ENV NODE_ENV=production
ENV PATH="/app/bin:${PATH}"

LABEL

Добавляет метаданные в формате ключ-значение. Используется для описания автора, версии, лицензии и т.д.

Пример:

LABEL maintainer="dev@example.com"
LABEL version="1.0" description="My Web App"

Метки можно просматривать через docker inspect.

WORKDIR

Задаёт рабочую директорию для всех последующих инструкций (RUN, CMD, COPY, ADD, ENTRYPOINT).

Пример:

WORKDIR /app

Если директория не существует — создаётся автоматически.

COPY

Копирует файлы или директории из контекста сборки в образ.

Синтаксис:

COPY [--chown=<user>:<group>] <src>... <dest>

Примеры:

COPY package.json ./
COPY src/ /app/src/
COPY --chown=node:node app.js /app/

Источник должен находиться внутри контекста сборки (обычно текущей директории).

ADD

Аналог COPY, но с дополнительными возможностями:

  • распаковка локальных tar-архивов
  • загрузка файлов по URL

Рекомендация: использовать COPY, если не нужны эти функции. ADD усложняет понимание и отладку.

RUN

Выполняет команду в новом слое на этапе сборки.

Форматы:

  • Shell-формат: RUN apt-get update && apt-get install -y curl
  • Exec-формат: RUN ["executable", "param1", "param2"]

Рекомендации:

  • объединять связанные команды в одну строку через && для уменьшения числа слоёв
  • очищать кэш пакетного менеджера в той же строке

Пример:

RUN apt-get update && \
apt-get install -y --no-install-recommends \
curl \
ca-certificates && \
rm -rf /var/lib/apt/lists/*

EXPOSE

Объявляет порт, который контейнер будет слушать во время выполнения. Не публикует порт на хосте — это лишь документация.

Пример:

EXPOSE 8080

Публикация происходит через -p при docker run.

VOLUME

Создаёт точку монтирования для тома. Данные в этой директории не сохраняются в образе.

Пример:

VOLUME /data

USER

Задаёт пользователя для выполнения последующих инструкций и запуска контейнера.

Пример:

RUN adduser --disabled-password --gecos '' appuser
USER appuser

Рекомендуется не запускать приложения от root.

CMD

Задаёт команду по умолчанию для запуска контейнера. Может быть переопределена при docker run.

Форматы:

  • Shell: CMD npm start
  • Exec (предпочтительно): CMD ["npm", "start"]

Только одна CMD в Dockerfile — последняя имеет эффект.

ENTRYPOINT

Задаёт основную исполняемую команду, которую нельзя переопределить (но можно дополнить через CMD).

Пример:

ENTRYPOINT ["./myapp"]
CMD ["--help"]

При запуске:

docker run myapp            # → ./myapp --help
docker run myapp --version # → ./myapp --version

HEALTHCHECK

Определяет команду для проверки работоспособности контейнера.

Синтаксис:

HEALTHCHECK [OPTIONS] CMD command

Опции:

  • --interval=DURATION (по умолчанию 30s)
  • --timeout=DURATION (по умолчанию 30s)
  • --start-period=DURATION (для медленного старта, по умолчанию 0s)
  • --retries=N (по умолчанию 3)

Пример:

HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1

STOPSIGNAL

Задаёт сигнал, отправляемый при остановке контейнера (по умолчанию SIGTERM).

Пример:

STOPSIGNAL SIGQUIT

SHELL

Изменяет shell по умолчанию для shell-формата команд.

Пример:

SHELL ["/bin/bash", "-c"]

Multi-stage сборки

Позволяют использовать несколько FROM в одном Dockerfile. Предыдущие стадии могут использоваться как источники для копирования файлов.

Преимущества:

  • уменьшение размера финального образа
  • разделение этапов сборки и выполнения

Пример (Node.js + production-only):

# Stage 1: сборка
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

# Stage 2: финальный образ
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
USER node
CMD ["node", "server.js"]

BuildKit

Современный движок сборки, включённый по умолчанию в Docker Desktop и новых версиях Docker Engine.

Возможности:

  • параллельная сборка
  • кэширование с учётом зависимостей
  • секреты без записи в образ (--mount=type=secret)
  • экспорт артефактов без создания образа

Включение (если не активирован):

DOCKER_BUILDKIT=1 docker build .

Использование секретов:

# syntax=docker/dockerfile:1
RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

Запуск:

docker build --secret id=mysecret,src=./secret.txt .

Работа с реестрами (Registry)

Авторизация

docker login
docker login registry.example.com

Учётные данные хранятся в ~/.docker/config.json.

Тегирование и публикация

docker tag myapp:latest registry.example.com/myapp:v1.0
docker push registry.example.com/myapp:v1.0

Pull-политики

  • always: всегда скачивать
  • missing: только если отсутствует локально
  • never: использовать только локальный

По умолчанию — missing.

Multi-arch образы (манифесты)

Создание образа для нескольких архитектур:

docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest --push .

Требует buildx (входит в Docker Desktop).


Безопасность

Лучшие практики

  • Использовать минимальные базовые образы (alpine, distroless)
  • Не запускать от root
  • Удалять ненужные инструменты (curl, wget, git) из финального образа
  • Сканировать образы на уязвимости (docker scan, Trivy, Clair)
  • Использовать .dockerignore для исключения чувствительных файлов
  • Хранить секреты вне образа (через --secret, docker secrets в Swarm, или внешние vaults)

.dockerignore

Аналог .gitignore. Исключает файлы из контекста сборки.

Пример:

.git
node_modules
.env
*.log
Dockerfile*
README.md

Docker Compose — Справочник

Файл docker-compose.yml определяет сервисы, сети, тома.

Базовая структура

version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data

volumes:
db_data:

Ключевые поля сервиса

  • image / build: образ или путь к Dockerfile
  • ports: проброс портов
  • volumes: монтирование томов
  • environment: переменные окружения
  • env_file: загрузка из файла
  • depends_on: порядок запуска (не гарантирует готовность!)
  • restart: политика перезапуска
  • healthcheck: проверка здоровья
  • networks: подключение к сетям
  • deploy: параметры для Swarm (ресурсы, реплики)

Команды

  • docker-compose up: запуск
  • docker-compose down: остановка и удаление
  • docker-compose build: пересборка
  • docker-compose logs -f: просмотр логов

Конфигурация Docker Daemon

Docker Daemon (dockerd) управляется через файл конфигурации daemon.json, обычно расположенный в /etc/docker/daemon.json (Linux) или настраивается через Docker Desktop (macOS/Windows).

Структура daemon.json

Пример полного файла:

{
"debug": true,
"log-level": "info",
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"],
"insecure-registries": ["registry.local:5000"],
"registry-mirrors": ["https://mirror.gcr.io"],
"data-root": "/mnt/docker-data",
"exec-opts": ["native.cgroupdriver=systemd"],
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"features": {
"buildkit": true
},
"experimental": false,
"userns-remap": "default",
"live-restore": true,
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"shutdown-timeout": 30
}

Ключевые параметры

Общие

  • debug: включает отладочный режим
  • log-level: уровень логирования (debug, info, warn, error, fatal)
  • experimental: включает экспериментальные функции

Сетевые настройки

  • hosts: список адресов для прослушивания (Unix-сокет, TCP)
  • insecure-registries: реестры без HTTPS (только для внутренних сетей!)
  • registry-mirrors: зеркала Docker Hub для ускорения загрузки

Хранилище

  • data-root: директория для хранения образов, контейнеров, томов (по умолчанию /var/lib/docker)
  • storage-driver: драйвер хранилища (overlay2, btrfs, zfs, aufs)

Рекомендуется overlay2 на современных ядрах Linux.

Безопасность

  • userns-remap: включает user namespace remapping для изоляции UID/GID
  • icc: межконтейнерная связь (false запрещает все соединения без явной сети)
  • iptables: управление правилами iptables (false отключает автоматическое управление)

Производительность

  • max-concurrent-downloads: максимум одновременных загрузок слоёв (по умолчанию 3)
  • max-concurrent-uploads: максимум одновременных выгрузок (по умолчанию 5)
  • default-shm-size: размер /dev/shm по умолчанию (64m)

Жизненный цикл

  • live-restore: позволяет контейнерам продолжать работу при перезапуске демона
  • shutdown-timeout: время ожидания graceful shutdown перед завершением демона

После изменения daemon.json требуется перезапуск:

sudo systemctl reload docker
# или
sudo systemctl restart docker

Rootless Mode

Rootless mode позволяет запускать Docker Daemon без прав root, повышая безопасность.

Преимущества

  • Изоляция от системных привилегий
  • Защита от escape-атак
  • Возможность запуска обычным пользователем

Ограничения

  • Недоступны порты < 1024 без authbind
  • Ограниченная поддержка некоторых драйверов (например, --privileged)
  • Требуется поддержка user namespaces в ядре

Установка

curl -fsSL https://get.docker.com/rootless | sh

Переменные окружения:

export PATH=/home/user/bin:$PATH
export DOCKER_HOST=unix:///run/user/1000/docker.sock

Конфигурация хранится в ~/.config/docker/.


Docker Contexts

Контекст — это набор настроек для взаимодействия с разными Docker-хостами (локальный, удалённый, Swarm, Kubernetes).

Команды

  • docker context ls: список контекстов
  • docker context use <name>: переключение
  • docker context create: создание нового контекста

Пример создания удалённого контекста:

docker context create remote \
--docker host=tcp://192.168.1.100:2375

После переключения:

docker context use remote
docker ps # покажет контейнеры на удалённом хосте

Контексты особенно полезны при работе с несколькими средами: dev, staging, prod.


Плагины

Docker поддерживает расширение функциональности через плагины.

Типы плагинов

  • Network plugins: Calico, Weave, Flannel
  • Volume plugins: Portworx, NetApp, AWS EFS driver
  • Authorization plugins: контроль доступа к API
  • Logging plugins: отправка логов в ELK, Splunk

Управление

  • docker plugin install: установка
  • docker plugin enable / disable: активация/деактивация
  • docker plugin rm: удаление

Пример:

docker plugin install store/vieux/sshfs
docker volume create --driver vieux/sshfs -o sshcmd=user@host:/path vol

Диагностика и устранение неполадок

Частые проблемы и решения

Контейнер сразу завершается

  • Причина: основной процесс завершился
  • Решение: проверить CMD/ENTRYPOINT, использовать docker logs, запустить в интерактивном режиме

Не хватает места на диске

  • Команда: docker system df
  • Очистка: docker system prune -a --volumes

Порт уже занят

  • Ошибка: port is already allocated
  • Решение: освободить порт или изменить -p mapping

Доступ к сети заблокирован

  • Проверить: iptables, ufw, SELinux/AppArmor
  • Временное решение: --security-opt label=disable

Медленная сборка

  • Причины: отсутствие кэша, большой контекст, медленный интернет
  • Решение: оптимизировать .dockerignore, использовать BuildKit, multi-stage

Полезные команды диагностики

docker info                # общая информация о системе
docker stats # использование ресурсов в реальном времени
docker top <container> # процессы внутри контейнера
docker events # поток событий (создание, остановка и т.д.)
journalctl -u docker # логи демона (systemd)